//
//  RevanNetworkManager.swift
//  weibo_swift
//
//  Created by 紫荆秋雪 on 16/12/19.
//  Copyright © 2016年 紫荆秋雪. All rights reserved.
//  网络管理工具

import UIKit
import AFNetworking

///枚举来确定是 GET请求还是 POST请求
enum RevanHTTPMethod {
    case GET
    case POST
}

/// 网络管理工具

class RevanNetworkManager: AFHTTPSessionManager {

    // 1、网络管理工具单例
    static let shared: RevanNetworkManager = {
        // 实例化单例
        let instance = RevanNetworkManager()
        // 改造单例，从而让AFN的反序列化支持 text/plain 类型
    instance.responseSerializer.acceptableContentTypes?.insert("text/plain")
        // 返回
        return instance
    }()
    
    /// 用户模型懒加载
    lazy var userAccount = RevanUserAccount()
    
    /// 用户登录标记(计算型属性)
    var userLogon: Bool {
        return userAccount.access_token != nil
    }
        
    //2、专门负责拼接 token的网络请求方法
    /// 专门负责拼接 token的网络请求方法
    ///
    /// - Parameters:
    ///   - method: GET / POST的枚举
    ///   - URLString: 网络URL
    ///   - parameters: 参数
    ///   - completion: 回调
    func tokenRequest(method: RevanHTTPMethod = .GET, URLString: String,parameters: Any?, completion:@escaping (Any?, Bool)->()) {
        //处理 token 字典
        // Initializer for conditional binding must have Optional type, not 'String'
        guard let token = userAccount.access_token else {
            print("accessToken为空")
            // token为空发出通知
            RevanNotificationCenter.post(name: NSNotification.Name(rawValue: RevanUserShouldLoginNotification), object: nil)
            
            // 回调
            completion(nil, false)
            return
        }
        //判断 参数字典是否存在，如果为nil，应该新建一个字典
        //强制转化成  字典
        var parameters = parameters as? [String: AnyObject]
        if parameters == nil {
            //实例化一个字典
            parameters = [String: AnyObject]()
        }
        // 设置参数字典，代码在此处字典一定有值
        parameters!["access_token"] = token as AnyObject?
        
        //调用 request 发起真正的网络请求方法
        request(URLString: URLString, parameters: parameters, completion: completion)
    }
 
    
    // 3、封装AFN的 GET / POST 请求方法
    
    /// 封装AFN的 GET / POST 请求方法
    ///
    /// - Parameters:
    ///   - method: GET / POST的枚举
    ///   - URLString: 网络URL
    ///   - parameters: 参数
    ///   - complition: 回调
    func request(method: RevanHTTPMethod = .GET, URLString: String,parameters: Any?, completion:@escaping (Any?, Bool)->()) {
        
        let success = {(task:URLSessionDataTask, json: Any?)->() in
            completion(json, true)
        }
        
        let failure = {(task: URLSessionDataTask?, error: Error)->() in
            
            //针对 403 处理用户 token过期
            if (task?.response as? HTTPURLResponse )?.statusCode == 403{
                print("Token 过期了")
                // 发送通知（本方法不知道被谁调用，谁接收到通知，谁处理！）
                RevanNotificationCenter.post(name: NSNotification.Name(rawValue: RevanUserShouldLoginNotification), object: "403")
            }
            
            
            print("请求错误\(error)")
            completion(nil, false)
        }
        
        //判断请求方式
        if method == .GET {
            get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        } else {
            post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }
    }
}







